 /*
 *  Mainradios.java
 * 
 * Clase main que implementa al objeto Miradios el cual representa a una radio simple AM/FM con la capacidad de guardar
 * emisoras de radio
 * 
 * 
 *  Universidad del Valle de Guatemala            Algoritmos y Estructura de Datos 
 *  Seccion 20
 *  Hoja de trabajo 1
 */

/**
 *
 * @author Alejandro Rojas Carne 10104
 */
import java.util.Scanner;
import java.util.InputMismatchException;

/**
 * 
 * @author Alejandro Rojas Carne 10104
 */
public class Mainradios {

    /**
     * 
     * @param args  necesarios para el metodo main
     */
    
    public static void main(String[] args) {
      Miradios radio = new Miradios();  
      boolean control = false;
      int opcion,botoning = 0;
      Scanner teclado = new Scanner(System.in);
  
    
    
     do{
         //llamada de metodo menu para mostra el menu en pantalla 
            menu();
            
            System.out.println("+--      ESTADO DEL RADIO  --+");
            System.out.println(radio);
            //-----------------------------------------------------
            opcion = (int)verificar(0);
            
            if (opcion < 0)
                opcion = 0;
            //-----------------------------------------------------
            switch(opcion){
                case 1: // Seleccion para encender o apagar el radio, ademas le asigna a la variable control 
                        // el valor booleano de true si esta encendido o false si esta apagado 
			control = (radio.power());
                break;
                    
                case 2: // Cambiar AM/FM o FM/AM
                        // se toma en consideracion si la radio se encuentra encendida o apagada y que si esta
                        // apagado no es posible realizar acciones.
                        if (control)
                            radio.cambio();
                        else
                        { //instrucciones que se ejecutan si la radio se encuentra apagada
                            System.out.println("La radio se encuentra apagada No es posible realizar accion");
                            System.out.println("Presione ENTER para continuar ");
                            teclado.nextLine();//Atrapar el ENTER
                        }
                break;
                
		case 3 : // adelantar emisora a la siguiente emisora disponible en AM o FM depende el caso
                        // este metodo se realiza o no, dependiendo de la variable de control que indica el estado del radio
                     if (control)
                            radio.fw();
                        else
                        {//Lineas que se ejecutan cuando el radio esta apagado
                            System.out.println("La radio se encuentra apagada No es posible realizar accion");
                            System.out.println("Presione ENTER para continuar ");
                            teclado.nextLine();//Atrapar el ENTER
                        }
                        
		break;
                    
                case 4:// regresar emisora funciona de igual manera que adelantar la emisora con la diferencia que regresa y no adelanta
                    if (control)
                            radio.bw();
                        else
                        {
                            System.out.println("La radio se encuentra apagada No es posible realizar accion");
                            System.out.println("Presione ENTER para continuar ");
                            teclado.nextLine();//Atrapar el ENTER
                        }
                        
                break;
                    
                case 5:// opcion que llama al meto store el cual permite guardar emisoras
                    //si el radio esta encendido se solicita el ingreso de un valor para la memoria
                        if (control) 
                        {
                            botoning = (int)verificar(1);// metodo que permite verificar si el ingreso es un entero
                            if ((botoning < 13)  && (botoning > 0))//si el valor ingresado es entero entonces se evalua si es un valor en el intervalo de la cantidad de memorias
                                            radio.store(botoning);
                            else// de no ingresar un valor entero que representa una memoria se muestra el mensaje en pantalla
                                System.out.println("No ha ingresado el valor de un boton el valor debe estar entro 1 y 12");
                        }
                        else//si la radio se encuentra apagado se muestra el mensaje de radio apagada, pero el mensaje de ENTER para continuar siempre se muestra
                            System.out.println("La radio esta apagada No es posible realizar accion");
                            System.out.println("Presione ENTER para continuar ");
                            teclado.nextLine();//Atrapar el ENTER permite tener una pausa hasta presionar ENTER
                break;
                
                case 6: // metodo que permite seleccionar emisoras guardadas
                    // variable control que permite determinar si la radio esta encendida o apagada
                    //funciona de igual manera al case 5 con la variacion del metodo de radio a llamar en lugar de .store  se llama a .select
                        if (control) 
                        {
                            botoning = (int)verificar(1);
                            if ((botoning < 13)  && (botoning > 0))
                                     radio.select(botoning);
                            else
                                System.out.println("No ha ingresado el valor de un boton el valor debe estar entro 1 y 12");
                        }
                        else
                            System.out.println("La radio esta apagada No es posible realizar accion");
                            System.out.println("Presione ENTER para continuar ");
                            teclado.nextLine();//Atrapar el ENTER que permite hacer una pausa hasta presionar ENTER
                break;
                
                case 7: // opcion de salir que muestra un mensaje de despedida de la aplicacion
                    System.out.println("Feliz Dia Adios");
                break;
                
                default:// si ninguna de las ipciones mostradas anteriormente es elegida se muestra este mensaje de error como default
                    System.out.println("\nERROR: ~~> Opcion invalida.\n");            
            }
        }while(opcion!=7);
        
        
        
    
    }
    
    /**
     * metodo menu que permite enviar a pantalla las opciones disponibles de manera creativa 
     */
    public static void menu(){
        System.out.println();
        System.out.println("+--      MENU DE OPCIONES      --+");
        System.out.println("| 1.   Encender/Apagar           |");
        System.out.println("| 2.   Cambiar AM/FM o FM/AM     |");
        System.out.println("| 3.   Adelantar Emisora         |");
        System.out.println("| 4.   Regresar Emisora          |");
        System.out.println("| 5.   Guardar Estacion          |");
        System.out.println("| 6.   Seleccionar Estacion      |");
        System.out.println("| 7.   Salir de Programa         |");
        System.out.println("+--------------------------------+");
    }
    /**
     * Metodo verificar permite el ingreso de por teclado de cualquier escrito pero
     * verifica si ese escrito es un numero, si es un numero entonces no hay error, sin importar si es real o entero
     * pero si no es un numero entonces se muestra un mensaje de error.
     * @param op parametro que permite determinar que mensaje mostrar en pantalla al momento de solicitar 
     * un ingreso, puede solicitar el mensaje de una opcion o un boton
     * @return devuelve un valor real double
     */
    public static double verificar(int op){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
	if(op == 0)
			System.out.println("Ingrese su opcion por favor");
        if (op ==1)
                        System.out.println("Ingrese el numero del boton deseado ");
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
                System.out.println("\nERROR: ~~> Dato invalido. ingrese un numero entero\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }
    
    
}
